<!DOCTYPE html>
<html lang="zh-CN">
<head>
	<meta charset="UTF-8">
	<meta http-equiv="X-UA-Compatible" content="IE=edge">
	<meta name="viewport" content="width=device-width, initial-scale=1">
	<link rel="profile" href="https://gmpg.org/xfn/11">
	<link href="https://blog.lixypro.com/wp-content/themes/ripro/assets/images/favicon/favicon.png" rel="icon">
  <title>IPtables for Linux详解以及实例 - Lixypro博客</title>

	<meta name="robots" content="index, follow, max-image-preview:large, max-snippet:-1, max-video-preview:-1">

	<!-- This site is optimized with the Yoast SEO plugin v16.1.1 - https://yoast.com/wordpress/plugins/seo/ -->
	<title>IPtables for Linux详解以及实例 - Lixypro博客</title>
	<meta name="description" content="Lixypro博客 - 后端运维 - IPtables for Linux详解以及实例 netfilter/iptables包过滤系统被称为单个实体，但它实际上由netfilter和iptables两个组件组成。">
	<link rel="canonical" href="https://blog.lixypro.com/houduanyunwei/iptables-for-linux-detailed-explanation-and-examples.html">
	<meta property="og:locale" content="zh_CN">
	<meta property="og:type" content="article">
	<meta property="og:title" content="IPtables for Linux详解以及实例 - Lixypro博客">
	<meta property="og:description" content="Lixypro博客 - 后端运维 - IPtables for Linux详解以及实例 netfilter/iptables包过滤系统被称为单个实体，但它实际上由netfilter和iptables两个组件组成。">
	<meta property="og:url" content="https://blog.lixypro.com/houduanyunwei/iptables-for-linux-detailed-explanation-and-examples.html">
	<meta property="og:site_name" content="Lixypro博客">
	<meta property="article:published_time" content="2021-04-10T10:16:44+00:00">
	<meta property="og:image" content="https://blog.lixypro.com/wp-content/uploads/2021/04/1618049585-9d70a7e2c2e0fdb.png">
	<meta property="og:image:width" content="1118">
	<meta property="og:image:height" content="329">
	<meta name="twitter:card" content="summary_large_image">
	<meta name="twitter:label1" content="作者">
	<meta name="twitter:data1" content="administrator">
	<meta name="twitter:label2" content="预计阅读时间">
	<meta name="twitter:data2" content="8分">
	<script type="application/ld+json" class="yoast-schema-graph">{"@context":"https://schema.org","@graph":[{"@type":"WebSite","@id":"https://blog.lixypro.com/#website","url":"https://blog.lixypro.com/","name":"Lixypro博客","description":"技术分享|网页前端|后端运维|网络安全|日常记事","potentialAction":[{"@type":"SearchAction","target":"https://blog.lixypro.com/?s={search_term_string}","query-input":"required name=search_term_string"}],"inLanguage":"zh-CN"},{"@type":"ImageObject","@id":"https://blog.lixypro.com/houduanyunwei/iptables-for-linux-detailed-explanation-and-examples.html#primaryimage","inLanguage":"zh-CN","url":"https://blog.lixypro.com/wp-content/uploads/2021/04/1618049585-9d70a7e2c2e0fdb.png","contentUrl":"https://blog.lixypro.com/wp-content/uploads/2021/04/1618049585-9d70a7e2c2e0fdb.png","width":1118,"height":329},{"@type":"WebPage","@id":"https://blog.lixypro.com/houduanyunwei/iptables-for-linux-detailed-explanation-and-examples.html#webpage","url":"https://blog.lixypro.com/houduanyunwei/iptables-for-linux-detailed-explanation-and-examples.html","name":"IPtables for Linux详解以及实例 - Lixypro博客","isPartOf":{"@id":"https://blog.lixypro.com/#website"},"primaryImageOfPage":{"@id":"https://blog.lixypro.com/houduanyunwei/iptables-for-linux-detailed-explanation-and-examples.html#primaryimage"},"datePublished":"2021-04-10T10:16:44+00:00","dateModified":"2021-04-10T10:16:44+00:00","author":{"@id":"https://blog.lixypro.com/#/schema/person/504c3e2a3d8a31f292936e7a2241373b"},"description":"Lixypro博客 - 后端运维 - IPtables for Linux详解以及实例 netfilter/iptables包过滤系统被称为单个实体，但它实际上由netfilter和iptables两个组件组成。","breadcrumb":{"@id":"https://blog.lixypro.com/houduanyunwei/iptables-for-linux-detailed-explanation-and-examples.html#breadcrumb"},"inLanguage":"zh-CN","potentialAction":[{"@type":"ReadAction","target":["https://blog.lixypro.com/houduanyunwei/iptables-for-linux-detailed-explanation-and-examples.html"]}]},{"@type":"BreadcrumbList","@id":"https://blog.lixypro.com/houduanyunwei/iptables-for-linux-detailed-explanation-and-examples.html#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"item":{"@type":"WebPage","@id":"https://blog.lixypro.com/","url":"https://blog.lixypro.com/","name":"首页"}},{"@type":"ListItem","position":2,"item":{"@type":"WebPage","@id":"https://blog.lixypro.com/houduanyunwei/iptables-for-linux-detailed-explanation-and-examples.html","url":"https://blog.lixypro.com/houduanyunwei/iptables-for-linux-detailed-explanation-and-examples.html","name":"IPtables for Linux详解以及实例"}}]},{"@type":"Person","@id":"https://blog.lixypro.com/#/schema/person/504c3e2a3d8a31f292936e7a2241373b","name":"administrator","image":{"@type":"ImageObject","@id":"https://blog.lixypro.com/#personlogo","inLanguage":"zh-CN","url":"https://secure.gravatar.com/avatar/957d4bcaf62a121072d884ad505a9b2a?s=96&d=mm&r=g","contentUrl":"https://secure.gravatar.com/avatar/957d4bcaf62a121072d884ad505a9b2a?s=96&d=mm&r=g","caption":"administrator"},"sameAs":["https://blog.lixypro.com"]}]}</script>
	<!-- / Yoast SEO plugin. -->


<link rel="stylesheet" id="toc-screen-css" href="https://blog.lixypro.com/wp-content/plugins/table-of-contents-plus/screen.min.css?ver=2002" type="text/css" media="all">
<link rel="stylesheet" id="Katex-css" href="https://cdn.jsdelivr.net/wp/wp-editormd/tags/10.2.1/assets/KaTeX/katex.min.css?ver=10.2.1" type="text/css" media="all">
<link rel="stylesheet" id="prism-theme-style-css" href="https://cdn.jsdelivr.net/wp/wp-editormd/tags/10.2.1/assets/Prism.js/themes/prism-okaidia.css?ver=1.15.0" type="text/css" media="all">
<link rel="stylesheet" id="prism-plugin-toolbar-css" href="https://cdn.jsdelivr.net/wp/wp-editormd/tags/10.2.1/assets/Prism.js/plugins/toolbar/prism-toolbar.css?ver=1.15.0" type="text/css" media="all">
<link rel="stylesheet" id="prism-plugin-line-numbers-css" href="https://cdn.jsdelivr.net/wp/wp-editormd/tags/10.2.1/assets/Prism.js/plugins/line-numbers/prism-line-numbers.css?ver=1.15.0" type="text/css" media="all">
<link rel="stylesheet" id="external-css" href="https://blog.lixypro.com/wp-content/themes/ripro/assets/css/external.css?ver=7.1.0" type="text/css" media="all">
<link rel="stylesheet" id="sweetalert2-css" href="https://blog.lixypro.com/wp-content/themes/ripro/assets/css/sweetalert2.min.css?ver=7.1.0" type="text/css" media="all">
<link rel="stylesheet" id="app-css" href="https://blog.lixypro.com/wp-content/themes/ripro/assets/css/app.css?ver=7.1.0" type="text/css" media="all">
<link rel="stylesheet" id="diy-css" href="https://blog.lixypro.com/wp-content/themes/ripro/assets/css/diy.css?ver=7.1.0" type="text/css" media="all">
<link rel="stylesheet" id="fancybox-css" href="https://blog.lixypro.com/wp-content/themes/ripro/assets/css/jquery.fancybox.min.css?ver=7.1.0" type="text/css" media="all">
<script type="text/javascript" src="https://blog.lixypro.com/wp-content/themes/ripro/assets/js/jquery-2.2.4.min.js?ver=2.2.4" id="jquery-js"></script>
<script type="text/javascript" src="https://blog.lixypro.com/wp-content/themes/ripro/assets/js/plugins/sweetalert2.min.js?ver=7.1.0" id="sweetalert2-js"></script>
		<script>
			document.documentElement.className = document.documentElement.className.replace( 'no-js', 'js' );
		</script>
				<style>.no-js img.lazyload { display: none; }
			figure.wp-block-image img.lazyloading { min-width: 150px; }
							.lazyload, .lazyloading { opacity: 0; }
				.lazyloaded {
					opacity: 1;
					transition: opacity 400ms;
					transition-delay: 0ms;
				}</style>
			<!-- HTML5 shim, for IE6-8 support of HTML5 elements. All other JS at the end of file. -->
    <!--[if lt IE 9]>
      <script src="https://blog.lixypro.com/wp-content/themes/ripro/assets/js/html5shiv.js"></script>
      <script src="https://blog.lixypro.com/wp-content/themes/ripro/assets/js/respond.min.js"></script>
    <![endif]-->
          <script> $(document).ready(function() { NProgress.start(); $(window).load(function() { NProgress.done(); }); });</script>
    </head>

<body class="post-template-default single single-post postid-43 single-format-standard  max_width navbar-sticky navbar-full navbar-slide no-search sidebar-none pagination-numeric no-off-canvas">

<div class="site">
    
<header class="site-header">
      <div class="navbar">
      <div class="logo-wrapper">
              <a href="https://blog.lixypro.com/">
          <img data-dark="" alt="Lixypro博客" data-src="https://blog.lixypro.com/wp-content/uploads/2021/04/1618068529-96d6f2e7e1f705a.png" class="logo regular tap-logo lazyload" src=""><noscript><img class="logo regular tap-logo" src="https://blog.lixypro.com/wp-content/uploads/2021/04/1618068529-96d6f2e7e1f705a.png" data-dark="" alt="Lixypro博客"></noscript>
        </a>
            </div>
      <div class="sep"></div>
      
      <nav class="main-menu hidden-xs hidden-sm hidden-md">
        <ul id="menu-menu-1" class="nav-list u-plain-list">
<li id="menu-item-12" class="menu-item menu-item-type-custom menu-item-object-custom menu-item-home menu-item-12"><a href="https://blog.lixypro.com/">本站首页</a></li>
<li id="menu-item-15" class="menu-item menu-item-type-post_type menu-item-object-page menu-item-15"><a href="https://blog.lixypro.com/tags">标签集合</a></li>
<li id="menu-item-18" class="menu-item menu-item-type-taxonomy menu-item-object-category menu-item-18"><a href="https://blog.lixypro.com/qianduansixiang">前端思想</a></li>
<li id="menu-item-19" class="menu-item menu-item-type-taxonomy menu-item-object-category current-post-ancestor current-menu-parent current-post-parent menu-item-19"><a href="https://blog.lixypro.com/houduanyunwei">后端运维</a></li>
<li id="menu-item-20" class="menu-item menu-item-type-taxonomy menu-item-object-category menu-item-20"><a href="https://blog.lixypro.com/zaixianfuwu">在线服务</a></li>
<li id="menu-item-21" class="menu-item menu-item-type-taxonomy menu-item-object-category menu-item-21"><a href="https://blog.lixypro.com/diannaojichu">电脑基础</a></li>
<li id="menu-item-22" class="menu-item menu-item-type-taxonomy menu-item-object-category menu-item-22"><a href="https://blog.lixypro.com/kejizixun">科技资讯</a></li>
<li id="menu-item-23" class="menu-item menu-item-type-taxonomy menu-item-object-category current-post-ancestor current-menu-parent current-post-parent menu-item-23"><a href="https://blog.lixypro.com/wangluoanquan">网络安全</a></li>
</ul>      </nav>
      
      <div class="main-search">
        <form method="get" class="search-form inline" action="https://blog.lixypro.com/">
  <input type="search" class="search-field inline-field" placeholder="输入关键词，回车..." autocomplete="off" value="" name="s" required="required">
  <button type="submit" class="search-submit"><i class="mdi mdi-magnify"></i></button>
</form>        <div class="search-close navbar-button"><i class="mdi mdi-close"></i></div>
      </div>

      <div class="actions">
                <!-- user end -->
        <div class="search-open navbar-button"><i class="mdi mdi-magnify"></i></div>
                <div class="burger"></div>
      </div>
    </div>
  </header>

<div class="header-gap"></div>    
    <div class="site-content">
    

<div class="container">
	<div class="breadcrumbs">
	当前位置：<a href="https://blog.lixypro.com/">Lixypro博客</a> <small>></small> <a href="https://blog.lixypro.com/houduanyunwei">后端运维</a> <small>></small> IPtables for Linux详解以及实例	</div>
	<div class="row">
		<div class="col-lg-12">
			<div class="content-area">
				<main class="site-main">
					<article id="post-43" class="article-content">
    <div class="container">
  
<div class="cao_entry_header">

  <header class="entry-header">    
    <h1 class="entry-title">IPtables for Linux详解以及实例</h1>  </header>
</div>
</div>  <div class="container">
    <div class="entry-wrapper">
            <div class="entry-content u-text-format u-clearfix">
        <p><code>netfilter/iptables</code>包过滤系统被称为单个实体，但它实际上由<code>netfilter</code>和<code>iptables</code>两个组件组成。<code>netfilter</code>也称为内核空间（KernelSpace），是内核的一部分，由包过滤表组成，这些表包含内核用来控制包过滤处理的规则集；<code>iptables</code>也称为用户空间（UserSpace），是主要配置工具，iptables 使插入、修改和删除信息包过滤表中的规则变得容易。</p>
<h2>基本参数</h2>
<table>
<thead>
<tr>
<th>参数</th>
<th>作用</th>
</tr>
</thead>
<tbody>
<tr>
<td>-P</td>
<td>设置默认策略:iptables -P INPUT (DROP</td>
</tr>
<tr>
<td>-F</td>
<td>清空规则链</td>
</tr>
<tr>
<td>-L</td>
<td>查看规则链</td>
</tr>
<tr>
<td>-A</td>
<td>在规则链的末尾加入新规则</td>
</tr>
<tr>
<td>-I</td>
<td>num 在规则链的头部加入新规则</td>
</tr>
<tr>
<td>-D</td>
<td>num 删除某一条规则</td>
</tr>
<tr>
<td>-s</td>
<td>匹配来源地址IP/MASK，加叹号&#8221;!&#8221;表示除这个IP外。</td>
</tr>
<tr>
<td>-d</td>
<td>匹配目标地址</td>
</tr>
<tr>
<td>-i</td>
<td>网卡名称 匹配从这块网卡流入的数据</td>
</tr>
<tr>
<td>-o</td>
<td>网卡名称 匹配从这块网卡流出的数据</td>
</tr>
<tr>
<td>-p</td>
<td>匹配协议,如tcp,udp,icmp</td>
</tr>
<tr>
<td>&#8211;dport num</td>
<td>匹配目标端口号</td>
</tr>
<tr>
<td>&#8211;sport num</td>
<td>匹配来源端口号</td>
</tr>
</tbody>
</table>
<h3>命令选项输入顺序</h3>
<pre><code class="language-shell line-numbers">iptables -t 表名 &lt;-A/I/D/R&gt; 规则链名 [规则号] &lt;-i/o 网卡名&gt; -p 协议名 &lt;-s 源IP/源子网&gt; --sport 源端口 &lt;-d 目标IP/目标子网&gt; --dport 目标端口 -j 动作
</code></pre>
<h3>工作机制</h3>
<p>规则链名包括(也被称为五个钩子函数（hook functions）)：</p>
<ul>
<li>
<strong>INPUT链</strong> ：处理输入数据包。</li>
<li>
<strong>OUTPUT链</strong> ：处理输出数据包。</li>
<li>
<strong>FORWARD链</strong> ：处理转发数据包。</li>
<li>
<strong>PREROUTING链</strong> ：用于目标地址转换（DNAT）。</li>
<li>
<strong>POSTOUTING链</strong> ：用于源地址转换（SNAT）。</li>
</ul>
<h4>防火墙的策略</h4>
<p>防火墙策略一般分为两种，一种叫<code>通</code>策略，一种叫<code>堵</code>策略，通策略，默认门是关着的，必须要定义谁能进。堵策略则是，大门是洞开的，但是你必须有身份认证，否则不能进。所以我们要定义，让进来的进来，让出去的出去，<code>所以通，是要全通，而堵，则是要选择</code>。当我们定义的策略的时候，要分别定义多条功能，其中：定义数据包中允许或者不允许的策略，filter过滤的功能，而定义地址转换的功能的则是nat选项。为了让这些功能交替工作，我们制定出了“表”这个定义，来定义、区分各种不同的工作功能和处理方式。</p>
<p>我们现在用的比较多个功能有3个：</p>
<ol>
<li>filter 定义允许或者不允许的，只能做在3个链上：INPUT ，FORWARD ，OUTPUT</li>
<li>nat 定义地址转换的，也只能做在3个链上：PREROUTING ，OUTPUT ，POSTROUTING</li>
<li>mangle功能:修改报文原数据，是5个链都可以做：PREROUTING，INPUT，FORWARD，OUTPUT，POSTROUTING</li>
</ol>
<p>我们修改报文原数据就是来修改TTL的。能够实现将数据包的元数据拆开，在里面做标记/修改内容的。而防火墙标记，其实就是靠mangle来实现的。</p>
<p>小扩展:</p>
<ul>
<li>对于filter来讲一般只能做在3个链上：INPUT ，FORWARD ，OUTPUT</li>
<li>对于nat来讲一般也只能做在3个链上：PREROUTING ，OUTPUT ，POSTROUTING</li>
<li>而mangle则是5个链都可以做：PREROUTING，INPUT，FORWARD，OUTPUT，POSTROUTING</li>
</ul>
<p>iptables/netfilter（这款软件）是工作在用户空间的，它可以让规则进行生效的，本身不是一种服务，而且规则是立即生效的。而我们iptables现在被做成了一个服务，可以进行启动，停止的。启动，则将规则直接生效，停止，则将规则撤销。</p>
<p>iptables还支持自己定义链。但是自己定义的链，必须是跟某种特定的链关联起来的。在一个关卡设定，指定当有数据的时候专门去找某个特定的链来处理，当那个链处理完之后，再返回。接着在特定的链中继续检查。</p>
<p>注意：规则的次序非常关键，<code>谁的规则越严格，应该放的越靠前</code>，而检查规则的时候，是按照从上往下的方式进行检查的。</p>
<p>表名包括：</p>
<ul>
<li>
<strong>raw</strong> ：高级功能，如：网址过滤。</li>
<li>
<strong>mangle</strong> ：数据包修改（QOS），用于实现服务质量。</li>
<li>
<strong>nat</strong> ：地址转换，用于网关路由器。</li>
<li>
<strong>filter</strong> ：包过滤，用于防火墙规则。</li>
</ul>
<p>动作包括：</p>
<ul>
<li>
<strong>ACCEPT</strong> ：接收数据包。</li>
<li>
<strong>DROP</strong> ：丢弃数据包。</li>
<li>
<strong>REDIRECT</strong> ：重定向、映射、透明代理。</li>
<li>
<strong>SNAT</strong> ：源地址转换。</li>
<li>
<strong>DNAT</strong> ：目标地址转换。</li>
<li>
<strong>MASQUERADE</strong> ：IP伪装（NAT），用于ADSL。</li>
<li>
<strong>LOG</strong> ：日志记录。</li>
</ul>
<h2>netfilter</h2>
<p>netfilter 选取了 5 个位置进行数据包操作：</p>
<ul>
<li>
<code>PREROUTING</code>：数据包流入网卡后进行路由前；</li>
<li>
<code>INPUT</code>：数据包流入用户空间前；</li>
<li>
<code>FORWARD</code>：设在不同的网卡之间；</li>
<li>
<code>OUTPUT</code>：数据包流出用户空间前；</li>
<li>
<code>POSTROUTING</code>：数据包进行路由后流出网卡前。</li>
</ul>
<h2>数据包流向</h2>
<p><a class="wp-editor-md-post-content-link" href="https://blog.lixypro.com/wp-content/uploads/2021/04/1618049585-9d70a7e2c2e0fdb.png"><img class="lazyload " src="" data-srcset="https://blog.lixypro.com/wp-content/uploads/2021/04/1618049585-9d70a7e2c2e0fdb.png" alt="iptables - 数据包流向"><noscript>
<img alt="iptables - 数据包流向" data-src="https://blog.lixypro.com/wp-content/uploads/2021/04/1618049585-9d70a7e2c2e0fdb.png" class="lazyload" src=""><noscript><img src="https://blog.lixypro.com/wp-content/uploads/2021/04/1618049585-9d70a7e2c2e0fdb.png" alt="iptables - 数据包流向"></noscript>
</noscript></a></p>
<ul>
<li>本机发出的包：本机进程 -&#62; OUTPUT链 -> 路由选择 -> POSTROUTING链 -> 出口网卡</li>
<li>本机收到的包：入口网卡 -&#62; PREROUTING链 -> 路由选择 -> 此时有两种可能的情况：
<ul>
<li>目的地址为本机：INPUT链 -> 本机进程</li>
<li>目的地址不为本机：FORWARD链 -> POSTROUTING链 -> 网卡出口（内核允许网卡转发的情况下）</li>
</ul>
</li>
</ul>
<h2>规则链和表</h2>
<p><strong>链、表、规则</strong><br>
首先需要搞清楚的三个概念就是：<strong>链（chain）</strong>、<strong>表（table）</strong>、<strong>规则（rule）</strong>：</p>
<ul>
<li>
<code>链</code>：即我们前面说的五个卡口（物理概念），<code>PREROUTING</code>、<code>INPUT</code>、<code>FORWARD</code>、<code>OUTPUT</code>、<code>POSTROUTING</code>；</li>
<li>
<code>表</code>：为了方便管理而提出的逻辑概念，每个表都有其特定的功能；有<code>raw</code>、<code>mangle</code>、<code>nat</code>、<code>filter</code>四张表；</li>
<li>
<code>规则</code>：很容易理解，规则就是用于描述如何处理一个数据包的；描述一条规则时都会说明它所在的链和所在的表。</li>
</ul>
<p>注意，后面会提到自定义链，自定义链与预定义的 5 个链虽然都叫做“链”，但是它们有着本质的不同，自定义链不是“自定义卡口”，它们只是一系列规则/动作的集合，一般用在 <code>-j</code>、<code>-g</code> 选项中，-j 其实是 <code>--jump</code>，而 -g 则是 <code>--goto</code>，-j 除了可以指定自定义链外，还可以指定其它的 target，但是 -g 只能指定自定义链。它们的区别：-j 指定的链在匹配完成后会返回当前链继续匹配下一条规则，而 -g 指定的链在匹配完成后不会返回到当前链，如果在自定义链中没有规则与之匹配，则按照当前链的 policy 处理（ACCEPT 或者 DROP）。</p>
<p><strong>表的优先级</strong><br>
所谓优先级就是处理的顺序，从左到右优先级依次降低：<code>raw -&gt; mangle -&gt; nat -&gt; filter</code>；</p>
<ul>
<li>
<code>raw</code>，优先级最高，通常与<code>NOTRACK</code>一起使用，用于跳过<code>连接跟踪（conntrack）</code>和 nat 表的处理；</li>
<li>
<code>mangle</code>，修改包头部的某些特殊条目，如 TOS、TTL、打上特殊标记 MARK 等，以影响后面的路由决策；</li>
<li>
<code>nat</code>，用于进行网络地址转换，如 SNAT（修改源地址）、DNAT（修改目的地址）、REDIRECT 重定向等；</li>
<li>
<code>filter</code>，用于过滤数据包，比如 ACCEPT（允许），DROP（丢弃）、REJECT（拒绝）、LOG（记录日志）；</li>
</ul>
<blockquote><p>
  raw 表除了 <code>-j NOTRACK</code> 外，还有一个常用的动作，那就是 <code>-j TRACE</code>，用于跟踪数据包，进行规则的调试，使用 dmesg 查看。
</p></blockquote>
<p><strong>默认策略</strong><br>
默认策略只有两个动作：ACCEPT、DROP；当一个数据包未与该链中的任何规则匹配时，它将被默认策略处理；<br>
也就是所谓的黑白名单，如果默认策略为 ACCEPT，则为黑名单模式，如果默认策略为 DROP，则为白名单模式。</p>
<p><strong>连接跟踪</strong><br>
<code>连接跟踪</code>，顾名思义，就是跟踪并记录网络连接的状态（你可能认为只有 TCP 才有“连接”这个概念，但是在 netfilter 中，TCP、UDP、ICMP 一视同仁）。netfilter 会为每个经过网络堆栈的连接生成一个<strong>连接记录项（Connection Entry）</strong>；此后所有属于此连接的数据包都被唯一地分配给这个连接并标识连接的状态；由所有连接记录项组成的表其实就是所谓的<strong>连接跟踪表</strong>。</p>
<p>为什么需要连接跟踪？因为它是<strong>状态防火墙和 NAT 的实现基础</strong>！</p>
<ul>
<li>
<code>状态防火墙</code>：iptables 的 conntrack/state 模块允许我们根据连接的状态进行规则配置，如果没有连接跟踪，那是做不到的。</li>
<li>
<code>NAT</code>，NAT 其实就是修改数据包的源地址/端口、目的地址/端口，如果没有连接跟踪，那么也不可能再找回修改前的地址信息。</li>
</ul>
<p>SNAT 可以说在每个家用路由器上都有，不过它可能不叫做 SNAT，而是 MASQUERADE，但是本质都是 SNAT，只不过 MASQUERADE 会自动获取设备的 IP 地址而已，一般用于 DHCP 环境。假设网关的公网 IP 为 1.1.1.1，内网网段为 192.168.1.0/24，某台内网主机的 IP 为 192.168.1.1，该内网主机的某个进程想与 2.2.2.2 这台服务器进行通信，则发出的包为 &#91;src: 192.168.1.1, dst: 2.2.2.2&#93;，路由到网关后，因为在网关的路由表中也没有匹配的条目，所以会发给默认路由（从公网网卡出去），不过发出去之前要先经过 POSTROUTING 链的处理，在 nat 表中该数据包的源地址会被转换为公网网卡的 IP 地址，即 1.1.1.1，也就是进行 SNAT，转换后变为 &#91;src: 1.1.1.1, dst: 2.2.2.2&#93;，然后才会从公网网卡出去（如果不进行 SNAT，那么数据包会被丢弃）；经过各级路由后，此数据包会到达 2.2.2.2 服务器，流入网卡，依次经过 PREROUTING -> 路由选择&#91;发往本机&#93; -> INPUT -> 本机进程，本机进程处理完后，数据包 &#91;src: 2.2.2.2, dst: 1.1.1.1&#93; 经过 OUTPUT -> 路由选择&#91;发往外网&#93; -> POSTROUTING -> 公网网卡 -> 各级路由后，到达 1.1.1.1 网关主机，流入网卡，数据包首先会被 PREROUTING 链处理，它会被一个隐式的 DNAT 规则处理（在 nat 表），将包的目的地址改为 192.168.1.1（通过读取连接记录项来获知），修改后的包为 &#91;src: 2.2.2.2, dst: 192.168.1.1&#93;，然后再进行路由选择，因为不是发往本机的，所以会到 FORWARD 链，然后再到 POSTROUTING 链，最后才被送到内网网卡，最终流入 192.168.1.1 内网主机，被进程接收并处理。试想一下，如果没有连接跟踪，那么回程的 DNAT 操作就瞎了，内网主机 192.168.1.1 也就永远无法收到这个数据包。</p>
<p>Linux 默认会为所有连接都创建连接记录项，而维护连接跟踪表是有开销的，要命的是这个表还有大小限制；<br>
因此，如果你在一个大流量的 Web 服务器上启用 iptables，很容易因为连接记录项过多而导致服务器拒绝连接！<br>
那么有什么解决的办法呢？利用 raw 表的 NOTRACK 功能，让所有发往 80 端口的数据包跳过连接跟踪和 nat 表。<br>
<code>iptables -t raw -I PREROUTING -p tcp --dport 80 -j NOTRACK</code>将所有发往 80/tcp 的数据包跳过 conntrack。</p>
<p>查看 conntrack 的使用情况、相关参数：</p>
<ul>
<li>
<code>cat /proc/sys/net/netfilter/nf_conntrack_max</code>：允许的最大连接记录项的数目，超过此值后会直接拒绝新连接</li>
<li>
<code>cat /proc/sys/net/netfilter/nf_conntrack_count</code>：查看当前已使用的连接记录项数目，如果居高不下则应考虑优化</li>
<li>
<code>cat /proc/sys/net/netfilter/nf_conntrack_buckets</code>：查看存储记录项的哈希桶的数目，默认为 nf&#95;conntrack&#95;max / 4</li>
</ul>
<p><strong>规则总体顺序</strong></p>
<ol>
<li>当一个数据包进入某个链时，首先按照表的优先级依次处理；</li>
<li>每个表中的规则都有序号（从 1 开始），数据包会根据规则序号依次进行匹配；</li>
<li>如果命中一条规则，则执行相应的动作；如果所有表的规则都未命中，则执行默认策略。</li>
</ol>
<h2>命令详解</h2>
<pre><code class="language-bash line-numbers">### 命令用法 (man 文档)
iptables [-t table] {-A|-C|-D} chain rule-specification         # (ipv4) 追加|检查|删除 规则
ip6tables [-t table] {-A|-C|-D} chain rule-specification        # (ipv6) 追加|检查|删除 规则
iptables [-t table] -I chain [rulenum] rule-specification       # 在 rulenum 处插入规则 (默认为 1)
iptables [-t table] -R chain rulenum rule-specification         # 替换第 rulenum 条规则
iptables [-t table] -D chain rulenum                            # 删除第 rulenum 条规则
iptables [-t table] -S [chain [rulenum]]                        # 打印指定 table 的规则
iptables [-t table] {-F|-L|-Z} [chain [rulenum]] [options...]   # 清空|列出|置零 链/规则
iptables [-t table] -P chain target                             # 设置默认策略
iptables [-t table] -N chain                                    # 新建自定义链
iptables [-t table] -X [chain]                                  # 删除自定义链
iptables [-t table] -E old-chain-name new-chain-name            # 重命名自定义链

### 一般形式
iptables [-t 表名] {-A|I|D|R} 链名 [规则号] 匹配规则 -j 动作

### 查看帮助
iptables --help             # 查看 iptables 的帮助
iptables -m 模块名 --help   # 查看指定模块的可用参数
iptables -j 动作名 --help   # 查看指定动作的可用参数

### 持久化规则
# 在 RHEL/CentOS 中，默认规则文件为 /etc/sysconfig/iptables
# 在 iptables 服务启动时，默认会加载该配置文件中定义的规则
# 如果想要设置的规则在重启后有效，就需要保存规则到这个文件
# 使用这两个工具：iptables-save、iptables-restore 重定向即可
## 保存当前规则
iptables-save &gt;/etc/sysconfig/iptables
iptables-save &gt;/etc/sysconfig/iptables.20171125
## 恢复当前规则
iptables-restore &lt;/etc/sysconfig/iptables
iptables-restore &lt;/etc/sysconfig/iptables.20171125

### 命令和选项
-t              # 指定要操作的表，如果省略则默认为 filter 表
-A              # "追加" 一条规则，只能追加到末尾
-I              # "插入" 一条规则，如果省略序号则默认为 1
-R              # "替换" 一条规则，必须指定序号
-D              # "删除" 一条规则，必须指定序号
-C              # "检查" 规则是否存在，如果存在则返回 0
-P              # 设置链的 "默认策略"，nat 表不允许修改默认策略
-S              # "查看" 规则（原始格式）
-L              # "打印" 规则（友好格式）
-F              # 清空表中的规则并将包计数器、字节计数器置零
-Z              # 将某个链或某条规则的包计数器、字节计数器置零
-N              # 新建自定义链
-X              # 删除自定义链
-E              # 重命名自定义链
-n              # 以数字形式显示地址和端口
-v              # 在打印规则时显示详细信息
--line-numbers  # 在打印规则时显示规则序号

### 反向匹配
# 只需在选项前面使用 ! 即可，如: ! -s 192.168.0.0/16 表示除 192.168/16 外的源 IP

### 通用匹配
-s addr[/mask][...] # 源 IP，可以有多个，使用逗号隔开，有多少个地址就有多少条规则
-d addr[/mask][...] # 目的 IP，可以有多个，使用逗号隔开，有多少个地址就有多少条规则
-i input-nic[+]     # 数据包来自哪个网卡，+ 表示通配符
-o output-nic[+]    # 数据包送往哪个网卡，+ 表示通配符
-p {tcp|udp|udplite|icmp|icmpv6|esp|ah|sctp|mh|all}
                    # 指定匹配的协议，all 表示所有

### 隐式扩展匹配 (tcp/udp/icmp)
## tcp 扩展
--sport port[:port]     # 源端口号，100:200 表示端口范围
--dport port[:port]     # 目的端口号，100:200 表示端口范围
--tcp-flags mask comp   # TCP 标志位，flags={SYN|ACK|FIN|RST|URG|PSH|ALL|NONE}
--syn                   # SYN 标志位，等同于 --tcp-flags SYN,RST,ACK,FIN SYN
--tcp-option number     # TCP 选项

## udp 扩展
--sport port[:port]     # 源端口号
--dport port[:port]     # 目的端口号

## icmp 扩展
--icmp-type name[/code] # icmp 类型，常用的两个: ping、pong，请求和应答

### 显式扩展匹配 (-m module-name)
## multiport 多端口
--sports port[,port:port,port...]   # 匹配多个源端口[范围]
--dports port[,port:port,port...]   # 匹配多个目的端口[范围]
--ports port[,port:port,port...]    # 匹配多个源和目的端口[范围]

## owner 所属用户(组)
--uid-owner userid[-userid]     # 匹配 UID[范围]/username
--gid-owner groupid[-groupid]   # 匹配 GID[范围]/groupname
--socket-exists                 # 匹配与套接字相关联的数据包

## state 连接状态(基本)
--state [INVALID|ESTABLISHED|NEW|RELATED|UNTRACKED][,...]
# NEW           新连接
# ESTABLISHED   已建立的连接
# RELATED       关联的连接，如 ftp
# INVALID       无效/非法的连接
# UNTRACKED     未启用连接跟踪的连接

## conntrack 连接状态
--ctstate {INVALID|ESTABLISHED|NEW|RELATED|UNTRACKED|SNAT|DNAT}[,...]

## iprange IP范围
--src-range ip[-ip]     # 匹配指定的源 IP 范围
--dst-range ip[-ip]     # 匹配指定的目的 IP 范围

## mac 源MAC地址
--mac-source XX:XX:XX:XX:XX:XX  # 匹配源 MAC 地址

## addrtype 地址类型
--src-type type[,...]   # 匹配 source ip 地址的类型
--dst-type type[,...]   # 匹配 destination ip 地址的类型
# UNSPEC       未指定的地址，如 0.0.0.0
# UNICAST      单播地址
# LOCAL        本机地址
# BROADCAST    广播地址
# ANYCAST      任播地址
# MULTICAST    多播地址
# BLACKHOLE    黑洞地址
# UNREACHABLE  不可达地址
# PROHIBIT     禁止访问的地址

## time 时间
--datestart time     # 起始日期 YYYY[-MM[-DD[Thh[:mm[:ss]]]]]
--datestop time      # 结束日期 YYYY[-MM[-DD[Thh[:mm[:ss]]]]]
--timestart time     # 起始时间 hh:mm[:ss]
--timestop time      # 结束时间 hh:mm[:ss]
--monthdays value    # 几号，1 至 31，默认为 all
--weekdays value     # 星期几，1 至 7，默认为 all
--kerneltz           # 使用内核时区而非 UTC

## string 关键字匹配
--from offset       # 设置起始偏移量
--to offset         # 设置结束偏移量
--algo {bm|kmp}     # 指定使用的算法
--icase             # 忽略大小写匹配
--string string     # 要匹配的字符串
--hex-string string # 要匹配的字符串，十六进制

## length 数据包大小
--length length[:length]    # 匹配数据包大小[范围]

## mark 防火墙标记
--mark value[/mask]     # 匹配有指定防火墙标记的数据包

## connmark "连接"标记
--mark value[/mask]     # 如果当前数据包所属的"连接"打了给定的标记，则匹配成功

## limit 速率限制
--limit avg             # 平均速率限制，如 3/hour，单位: sec|minute|hour|day
--limit-burst number    # 封顶速率限制，默认为 5

## connlimit 并发连接数
--connlimit-upto n      # 0..n
--connlimit-above n     # &gt; n

### -j target 动作
## 无参数系列
ACCEPT      # 接收数据包
DROP        # 丢弃数据包
CUST-CHAIN  # 进入自定义链
RETURN      # 退出当前链，分两种情况：
            # 如果当前链是自定义链，则返回调用链，继续匹配调用点的下一条规则
            # 如果当前链不是自定义链，则执行当前链的默认策略，如 ACCEPT、DROP

## 带参数系列
# REJECT 拒绝（带原因）
--reject-with type              # 丢弃数据包，并回复源主机，可用的 type 如下：
    icmp-net-unreachable        # ICMP 网络不可达
    net-unreach                 # 同上，别名
    icmp-host-unreachable       # ICMP 主机不可达
    host-unreach                # 同上，别名
    icmp-proto-unreachable      # ICMP 协议不可达
    proto-unreach               # 同上，别名
    icmp-port-unreachable       # ICMP 端口不可达（默认）
    port-unreach                # 同上，别名
    icmp-net-prohibited         # ICMP 网络限制
    net-prohib                  # 同上，别名
    icmp-host-prohibited        # ICMP 主机限制
    host-prohib                 # 同上，别名
    icmp-admin-prohibited       # ICMP 管理员限制
    admin-prohib                # 同上，别名
    tcp-reset                   # TCP RST 连接重置
    tcp-rst                     # 同上，别名

# MARK 打防火墙标记
--set-mark value[/mask]   # 设置标记，mask OR value（推荐）
--set-xmark value[/mask]  # 设置标记，mask XOR value
--and-mark bits           # 设置二进制标记，AND
--or-mark bits            # 设置二进制标记，OR
--xor-mask bits           # 设置二进制标记，XOR

# CONNMARK 打"连接"标记
--set-mark value[/mask]       # 设置当前数据包所属连接的连接标记
--save-mark [--mask mask]     # 将当前数据包的标记作为其所属连接的标记
--restore-mark [--mask mask]  # 将当前数据包所属连接的标记作为该数据包的标记

# LOG 防火墙日志，dmesg 可查看
--log-level level       # 日志级别（syslog.conf）
--log-prefix prefix     # 日志前缀字符串
--log-tcp-sequence      # 记录 TCP seq 序列号
--log-tcp-options       # 记录 TCP options 选项
--log-ip-options        # 记录 IP options 选项
--log-uid               # 记录套接字相关联的 UID
--log-macdecode         # 解析 MAC 地址和协议

# ULOG 防火墙日志，kernel 2.4+
--ulog-nlgroup nlgroup  # 记录的 NETLINK 组
--ulog-cprange size     # 要复制的字节数
--ulog-qthreshold       # 内核队列的消息阈值
--ulog-prefix prefix    # 日志前缀字符串

# NFLOG 防火墙日志，kernel 2.6+
--nflog-group NUM       # 记录的 NETLINK 组
--nflog-size NUM        # 要复制的字节数
--nflog-threshold NUM   # 内核队列的消息阈值
--nflog-prefix STRING   # 日志前缀字符串

# SNAT 源地址转换，用在 POSTROUTING、INPUT 链
--to-source [&lt;ipaddr&gt;[-&lt;ipaddr&gt;]][:port[-port]]
--random        # 映射到随机端口号
--random-fully  # 映射到随机端口号（PRNG 完全随机化）
--persistent    # 映射到固定地址

# DNAT 目的地址转换，用在 PREROUTING、OUTPUT 链
--to-destination [&lt;ipaddr&gt;[-&lt;ipaddr&gt;]][:port[-port]]
--random        # 映射到随机端口号
--persistent    # 映射到固定地址

# MASQUERADE 源地址转换（适用于 DHCP 动态 IP），用在 POSTROUTING 链
--to-ports &lt;port&gt;[-&lt;port&gt;]  # 映射到指定端口号[范围]
--random                    # 映射到随机端口号

# REDIRECT 目的地址转换（重定向至 localhost:端口号），用在 PREROUTING、OUTPUT 链
--to-ports &lt;port&gt;[-&lt;port&gt;]  # 重定向到指定端口号[范围]
--random                    # 重定向到随机端口号

</code></pre>
<p>Bash</p>
<p>Copy</p>
<h2>应用例子</h2>
<pre><code class="language-bash line-numbers">## 查看当前规则
iptables -t raw -nvL    # raw 表
iptables -t mangle -nvL # mangle 表
iptables -t nat -nvL    # nat 表
iptables -t filter -nvL # filter 表，默认

## 查看当前规则，并显示规则序号
iptables -t raw -nvL --line-numbers     # raw 表
iptables -t mangle -nvL --line-numbers  # mangle 表
iptables -t nat -nvL --line-numbers     # nat 表
iptables -t filter -nvL --line-numbers  # filter 表，默认

## 查看当前规则，简版
iptables -t raw -S
iptables -t mangle -S
iptables -t nat -S
iptables -t filter -S

## 允许来自其它主机的 ssh 连接，假设为默认端口号 22
iptables -t filter -A INPUT -p tcp -m tcp --dport 22 -j ACCEPT

## 允许来自其它主机的 http 连接，假设为默认端口号 80
iptables -t filter -A INPUT -p tcp -m tcp --dport 80 -j ACCEPT

## 拒绝所有 icmp 数据包，即禁止其它主机 ping、traceroute 本机
iptables -t filter -A INPUT -p icmp -j REJECT --reject-with host-unreach    # 主机不可达
iptables -t filter -A INPUT -p icmp -j DROP                                 # 或直接丢弃

## 限制 icmp 速率，一分钟平均只能 ping 20 次，最多 30 次
iptables -t filter -A INPUT -p icmp -m limit --limit 20/min --limit-burst 30 -j ACCEPT
iptables -t filter -A INPUT -p icmp -j REJECT --reject-with host-unreach # 否则直接丢弃

## 将发往 80/tcp、443/tcp 的数据包跳过连接跟踪和 nat 表的处理
iptables -t raw -I PREROUTING -p tcp -m multiport --dports 80,443 -j NOTRACK

## 将当前主机作为内网网关，做源地址转换
iptables -t nat -A POSTROUTING -s 192.168/16 ! -d 192.168/16 -j SNAT --to-source 12.34.56.78 # 假定公网 IP 为 12.34.56.78
iptables -t nat -A POSTROUTING -s 192.168/16 ! -d 192.168/16 -j MASQUERADE                   # 假定公网 IP 为 DHCP 动态 IP

## 将所有 TCP 流量（包括内网的）重定向至本机代理软件，监听端口为 12345
iptables -t nat -A PREROUTING -p tcp -s 192.168/16 -j REDIRECT --to-ports 12345
iptables -t nat -A OUTPUT -p tcp -j REDIRECT --to-ports 12345

## 添加规则、检查规则、删除规则
iptables -t filter -A OUTPUT -d 1.2.3.4 -j ACCEPT # 追加到末尾
iptables -t filter -I OUTPUT -d 1.2.3.4 -j ACCEPT # 插入到开头
iptables -t filter -C OUTPUT -d 1.2.3.4 -j ACCEPT # 检查规则是否存在，存在返回 0，不存在返回 1
iptables -t filter -D OUTPUT -d 1.2.3.4 -j ACCEPT # 删除匹配的规则，如果有多条则只会删除其中一条

## 清空所有链的规则（不删除自定义链）
iptables -t raw -F
iptables -t mangle -F
iptables -t nat -F
iptables -t filter -F

## 清空所有链的规则（并删除自定义链）
iptables -t raw -F
iptables -t raw -X
iptables -t mangle -F
iptables -t mangle -X
iptables -t nat -F
iptables -t nat -X
iptables -t filter -F
iptables -t filter -X

</code></pre>
<h3>开放指定的端口</h3>
<pre><code class="language-shell line-numbers">iptables -A INPUT -s 127.0.0.1 -d 127.0.0.1 -j ACCEPT               #允许本地回环接口(即运行本机访问本机)
iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT    #允许已建立的或相关连的通行
iptables -A OUTPUT -j ACCEPT         #允许所有本机向外的访问
iptables -A INPUT -p tcp --dport 22 -j ACCEPT    #允许访问22端口
iptables -A INPUT -p tcp --dport 80 -j ACCEPT    #允许访问80端口
iptables -A INPUT -p tcp --dport 21 -j ACCEPT    #允许ftp服务的21端口
iptables -A INPUT -p tcp --dport 20 -j ACCEPT    #允许FTP服务的20端口
iptables -A INPUT -j reject       #禁止其他未允许的规则访问
iptables -A FORWARD -j REJECT     #禁止其他未允许的规则访问
</code></pre>
<h3>屏蔽IP</h3>
<pre><code class="language-shell line-numbers">iptables -A INPUT -p tcp -m tcp -s 192.168.0.8 -j DROP  # 屏蔽恶意主机（比如，192.168.0.8
iptables -I INPUT -s 123.45.6.7 -j DROP       #屏蔽单个IP的命令
iptables -I INPUT -s 123.0.0.0/8 -j DROP      #封整个段即从123.0.0.1到123.255.255.254的命令
iptables -I INPUT -s 124.45.0.0/16 -j DROP    #封IP段即从123.45.0.1到123.45.255.254的命令
iptables -I INPUT -s 123.45.6.0/24 -j DROP    #封IP段即从123.45.6.1到123.45.6.254的命令是
</code></pre>
<h4>指定数据包出去的网络接口</h4>
<p>只对 OUTPUT，FORWARD，POSTROUTING 三个链起作用。</p>
<pre><code class="language-shell line-numbers">iptables -A FORWARD -o eth0
</code></pre>
<h4>查看已添加的规则</h4>
<pre><code class="language-shell line-numbers">iptables -L -n -v
Chain INPUT (policy DROP 48106 packets, 2690K bytes)
 pkts bytes target     prot opt in     out     source               destination
 5075  589K ACCEPT     all  --  lo     *       0.0.0.0/0            0.0.0.0/0
 191K   90M ACCEPT     tcp  --  *      *       0.0.0.0/0            0.0.0.0/0           tcp dpt:22
1499K  133M ACCEPT     tcp  --  *      *       0.0.0.0/0            0.0.0.0/0           tcp dpt:80
4364K 6351M ACCEPT     all  --  *      *       0.0.0.0/0            0.0.0.0/0           state RELATED,ESTABLISHED
 6256  327K ACCEPT     icmp --  *      *       0.0.0.0/0            0.0.0.0/0

Chain FORWARD (policy ACCEPT 0 packets, 0 bytes)
 pkts bytes target     prot opt in     out     source               destination

Chain OUTPUT (policy ACCEPT 3382K packets, 1819M bytes)
 pkts bytes target     prot opt in     out     source               destination
 5075  589K ACCEPT     all  --  *      lo      0.0.0.0/0            0.0.0.0/0
</code></pre>
<h4>启动网络转发规则</h4>
<p>公网<code>210.14.67.7</code>让内网<code>192.168.188.0/24</code>上网</p>
<pre><code class="language-shell line-numbers">iptables -t nat -A POSTROUTING -s 192.168.188.0/24 -j SNAT --to-source 210.14.67.127
</code></pre>
<h4>端口映射</h4>
<p>本机的 2222 端口映射到内网 虚拟机的22 端口</p>
<pre><code class="language-shell line-numbers">iptables -t nat -A PREROUTING -d 210.14.67.127 -p tcp --dport 2222  -j DNAT --to-dest 192.168.188.115:22
</code></pre>
<h4>字符串匹配</h4>
<p>比如，我们要过滤所有TCP连接中的字符串<code>test</code>，一旦出现它我们就终止这个连接，我们可以这么做：</p>
<pre><code class="language-shell line-numbers">iptables -A INPUT -p tcp -m string --algo kmp --string "test" -j REJECT --reject-with tcp-reset
iptables -L

# Chain INPUT (policy ACCEPT)
# target     prot opt source               destination
# REJECT     tcp  --  anywhere             anywhere            STRING match "test" ALGO name kmp TO 65535 reject-with tcp-reset
#
# Chain FORWARD (policy ACCEPT)
# target     prot opt source               destination
#
# Chain OUTPUT (policy ACCEPT)
# target     prot opt source               destination
</code></pre>
<h4>阻止Windows蠕虫的攻击</h4>
<pre><code class="language-shell line-numbers">iptables -I INPUT -j DROP -p tcp -s 0.0.0.0/0 -m string --algo kmp --string "cmd.exe"
</code></pre>
<h4>防止SYN洪水攻击</h4>
<pre><code class="language-shell line-numbers">iptables -A INPUT -p tcp --syn -m limit --limit 5/second -j ACCEPT
</code></pre>
<h2>ipset模块</h2>
<pre><code class="language-bash line-numbers">## 为什么需要 ipset 模块？
# 假设这么种情况，我现在要让本机所有 TCP 流量走代理，但是大陆地址要走直连
# 这时候我们会想到使用 iptables 添加白名单，放行所有发往大陆地址的数据包，如：

# 新建自定义链 CHNIP，存放所有大陆地址段
iptables -t mangle -N CHNIP
iptables -t mangle -A CHAIN -d 地址段1 -j ACCEPT
iptables -t mangle -A CHNIP -d 地址段2 -j ACCEPT
...
iptables -t mangle -A CHAIN -d 地址段N  -j ACCEPT

# 放行所有目的地址为大陆地址的 TCP 数据包
iptables -t mangle -A OUTPUT -p tcp -j CHNIP

# 但是，大陆地址段是很多的，粗略统计也有 5000+ 条，这么多条 iptables 规则是会严重拉低性能的！
# 这时候就需要 ipset 出场了，利用 ipset 的 hash 表将 O(n) 的时间复杂度将为 O(1)，具体用法如下：

# RHEL/CentOS 安装 ipset
yum -y install ipset
# ArchLinux 安装 ipset
pacman -S --needed ipset

# 创建 chnip 大陆地址段列表
ipset -N chnip hash:net

# 添加大陆地址 IP 段到列表中
ipset -A chnip 地址段1
ipset -A chnip 地址段2
...
ipset -A chnip 地址段N

# 添加一条 iptables 规则即可
iptables -t mangle -A OUTPUT -p tcp -m set --match-set chnip dst -j ACCEPT

## ipset 相关用法
ipset -L chnip                 # 列出大陆地址段列表
ipset -F chnip                 # 清空大陆地址段列表
ipset -X chnip                 # 删除大陆地址段列表
ipset -S chnip &gt;/etc/ipset.set # 保存大陆地址段列表
ipset -R       &lt;/etc/ipset.set # 恢复大陆地址段列表

ipset -L                       # 查看所有 ipset 集合
ipset -F                       # 清空所有 ipset 集合
ipset -X                       # 删除所有 ipset 集合
ipset -S                       # 导出所有 ipset 集合
ipset -R                       # 导入所有 ipset 集合
ipset -E old_set new_set       # 对 ipset 进行重命名

</code></pre>
<h2>参考链接</h2>
<p><a class="wp-editor-md-post-content-link" href="https://www.zfl9.com/iptables.html">iptables 详解</a>；<a class="wp-editor-md-post-content-link" href="https://wangchujiang.com/linux-command/c/iptables.html">iptables Linux上常用的防火墙软件</a></p>
      </div>
      <div id="pay-single-box"></div>
          <div class="entry-tags">
          <a href="https://blog.lixypro.com/tag/centos" rel="tag">
        Centos      </a>
          <a href="https://blog.lixypro.com/tag/iptables" rel="tag">
        iptables      </a>
          <a href="https://blog.lixypro.com/tag/%e5%ae%89%e5%85%a8" rel="tag">
        安全      </a>
      </div>
<div class="article-copyright">RIPRO主题是一个优秀的主题，极致后台体验，无插件，集成会员系统<br><a href="https://blog.lixypro.com/">Lixypro博客</a> &raquo; <a href="https://blog.lixypro.com/houduanyunwei/iptables-for-linux-detailed-explanation-and-examples.html">IPtables for Linux详解以及实例</a>
</div>

<div class="article-footer">
    <div class="author-box">
    <div class="author-image">
      <img alt="administrator" data-src="https://blog.lixypro.com/wp-content/themes/ripro/assets/images/avatar/1.png" class="lazyload avatar avatar-140 photo " height="140" width="140">    </div>
    <div class="author-info">
      <h4 class="author-name">
        <a target="_blank" href="javascript:;">administrator</a>
        <span class="label label-default"><i class="fa fa-diamond"></i> 普通</span>      </h4>
    </div>
  </div>
      <div class="xshare">
      <span class="xshare-title">分享到：</span>
            <a etap="share" data-share="qq" class="share-qq"><i class="fa fa-qq"></i></a>
      <a etap="share" data-share="weibo" class="share-weibo"><i class="fa fa-weibo"></i></a>
              <a href="javascript:;" class="btn-bigger-cover share-weixin" data-nonce="803bc2b049" data-id="43" data-action="create-bigger-image" id="bigger-cover"><i class="fa fa-paper-plane"></i></a>
        </div>
   
</div>    </div>
  </div>
</article>


  <div class="entry-navigation">
    <nav class="article-nav">
        <span class="article-nav-prev">上一篇<br><a href="https://blog.lixypro.com/houduanyunwei/the-difference-and-introduction-between-http-and-https-and-ssl-and-tls.html" rel="prev">HTTP与HTTPS与SSL与TLS的区别以及介绍</a></span>
        <span class="article-nav-next">下一篇<br><a href="https://blog.lixypro.com/houduanyunwei/linux-centos-install-nginx1-8-1-through-source-package.html" rel="next">Linux(centos)通过源码包方式安装nginx1.8.1</a></span>
    </nav>
    
  </div>

      <!-- # 标准网格模式... -->
      <div class="related-posts-grid">
        <h4 class="u-border-title">相关推荐</h4>
        <div class="row">
                     <div class="col-6 col-sm-3 col-md-3 mt-10 mb-10">
              <article class="post">
                  <div class="entry-media">
    <div class="placeholder" style="padding-bottom: 66.666666666667%;">
      <a target="_blank" href="https://blog.lixypro.com/houduanyunwei/detailed_explanation_of_the_process_of_compiling_and_installing_apache_on_centos_server_source_package.html">
        <img class="lazyload" data-src="https://blog.lixypro.com/wp-content/themes/ripro/timthumb.php?src=https://blog.lixypro.com/wp-content/themes/ripro/assets/images/thumb/1.jpg&#038;h=200&#038;w=300&#038;zc=1&#038;a=c&#038;q=100&#038;s=1" src="" alt="Centos服务器源码包编译安装Apache过程详解">  
      </a>
            <div class="cao-cover">
<img width="50" height="50px" data-src="https://blog.lixypro.com/wp-content/themes/ripro/assets/images/svg/rings.svg" class="lazyload" src=""><noscript>
<img width="50" height="50px" data-src="https://blog.lixypro.com/wp-content/themes/ripro/assets/images/svg/rings.svg" class="lazyload" src=""><noscript>
<img width="50" height="50px" data-src="https://blog.lixypro.com/wp-content/themes/ripro/assets/images/svg/rings.svg" class="lazyload" src=""><noscript>
<img width="50" height="50px" data-src="https://blog.lixypro.com/wp-content/themes/ripro/assets/images/svg/rings.svg" class="lazyload" src=""><noscript><img src="https://blog.lixypro.com/wp-content/themes/ripro/assets/images/svg/rings.svg" width="50" height="50px"></noscript>
</noscript>
</noscript>
</noscript>
</div>
          </div>
      </div>
                  <div class="entry-wrapper">
                  
  <header class="entry-header">    
    <h4 class="entry-title"><a target="_blank" href="https://blog.lixypro.com/houduanyunwei/detailed_explanation_of_the_process_of_compiling_and_installing_apache_on_centos_server_source_package.html" title="Centos服务器源码包编译安装Apache过程详解" rel="bookmark">Centos服务器源码包编译安装Apache过程详解</a></h4>  </header>                </div>
              </article>
            </div>
                      <div class="col-6 col-sm-3 col-md-3 mt-10 mb-10">
              <article class="post">
                  <div class="entry-media">
    <div class="placeholder" style="padding-bottom: 66.666666666667%;">
      <a target="_blank" href="https://blog.lixypro.com/houduanyunwei/use-firewalld-to-build-a-dynamic-firewall.html">
        <img class="lazyload" data-src="https://blog.lixypro.com/wp-content/themes/ripro/timthumb.php?src=https://blog.lixypro.com/wp-content/uploads/2021/04/1618139043-b6db0c73a979ae8.png&#038;h=200&#038;w=300&#038;zc=1&#038;a=c&#038;q=100&#038;s=1" src="" alt="Linux的FirewallD详细基础说明">  
      </a>
            <div class="cao-cover">
<img width="50" height="50px" data-src="https://blog.lixypro.com/wp-content/themes/ripro/assets/images/svg/rings.svg" class="lazyload" src=""><noscript>
<img width="50" height="50px" data-src="https://blog.lixypro.com/wp-content/themes/ripro/assets/images/svg/rings.svg" class="lazyload" src=""><noscript>
<img width="50" height="50px" data-src="https://blog.lixypro.com/wp-content/themes/ripro/assets/images/svg/rings.svg" class="lazyload" src=""><noscript>
<img width="50" height="50px" data-src="https://blog.lixypro.com/wp-content/themes/ripro/assets/images/svg/rings.svg" class="lazyload" src=""><noscript><img src="https://blog.lixypro.com/wp-content/themes/ripro/assets/images/svg/rings.svg" width="50" height="50px"></noscript>
</noscript>
</noscript>
</noscript>
</div>
          </div>
      </div>
                  <div class="entry-wrapper">
                  
  <header class="entry-header">    
    <h4 class="entry-title"><a target="_blank" href="https://blog.lixypro.com/houduanyunwei/use-firewalld-to-build-a-dynamic-firewall.html" title="Linux的FirewallD详细基础说明" rel="bookmark">Linux的FirewallD详细基础说明</a></h4>  </header>                </div>
              </article>
            </div>
                      <div class="col-6 col-sm-3 col-md-3 mt-10 mb-10">
              <article class="post">
                  <div class="entry-media">
    <div class="placeholder" style="padding-bottom: 66.666666666667%;">
      <a target="_blank" href="https://blog.lixypro.com/houduanyunwei/explanation-dns-cache-poisoning-is-also-called-dns-spoofing.html">
        <img class="lazyload" data-src="https://blog.lixypro.com/wp-content/themes/ripro/timthumb.php?src=https://blog.lixypro.com/wp-content/themes/ripro/assets/images/thumb/1.jpg&#038;h=200&#038;w=300&#038;zc=1&#038;a=c&#038;q=100&#038;s=1" src="" alt="解释:DNS缓存中毒也称为DNS欺骗">  
      </a>
            <div class="cao-cover">
<img width="50" height="50px" data-src="https://blog.lixypro.com/wp-content/themes/ripro/assets/images/svg/rings.svg" class="lazyload" src=""><noscript>
<img width="50" height="50px" data-src="https://blog.lixypro.com/wp-content/themes/ripro/assets/images/svg/rings.svg" class="lazyload" src=""><noscript>
<img width="50" height="50px" data-src="https://blog.lixypro.com/wp-content/themes/ripro/assets/images/svg/rings.svg" class="lazyload" src=""><noscript>
<img width="50" height="50px" data-src="https://blog.lixypro.com/wp-content/themes/ripro/assets/images/svg/rings.svg" class="lazyload" src=""><noscript><img src="https://blog.lixypro.com/wp-content/themes/ripro/assets/images/svg/rings.svg" width="50" height="50px"></noscript>
</noscript>
</noscript>
</noscript>
</div>
          </div>
      </div>
                  <div class="entry-wrapper">
                  
  <header class="entry-header">    
    <h4 class="entry-title"><a target="_blank" href="https://blog.lixypro.com/houduanyunwei/explanation-dns-cache-poisoning-is-also-called-dns-spoofing.html" title="解释:DNS缓存中毒也称为DNS欺骗" rel="bookmark">解释:DNS缓存中毒也称为DNS欺骗</a></h4>  </header>                </div>
              </article>
            </div>
                      <div class="col-6 col-sm-3 col-md-3 mt-10 mb-10">
              <article class="post">
                  <div class="entry-media">
    <div class="placeholder" style="padding-bottom: 66.666666666667%;">
      <a target="_blank" href="https://blog.lixypro.com/houduanyunwei/dns-server-construction-and-configuration.html">
        <img class="lazyload" data-src="https://blog.lixypro.com/wp-content/themes/ripro/timthumb.php?src=https://blog.lixypro.com/wp-content/uploads/2021/04/1618139491-b3bf60b851ebaeb.png&#038;h=200&#038;w=300&#038;zc=1&#038;a=c&#038;q=100&#038;s=1" src="" alt="DNS服务器搭建与配置">  
      </a>
            <div class="cao-cover">
<img width="50" height="50px" data-src="https://blog.lixypro.com/wp-content/themes/ripro/assets/images/svg/rings.svg" class="lazyload" src=""><noscript>
<img width="50" height="50px" data-src="https://blog.lixypro.com/wp-content/themes/ripro/assets/images/svg/rings.svg" class="lazyload" src=""><noscript>
<img width="50" height="50px" data-src="https://blog.lixypro.com/wp-content/themes/ripro/assets/images/svg/rings.svg" class="lazyload" src=""><noscript>
<img width="50" height="50px" data-src="https://blog.lixypro.com/wp-content/themes/ripro/assets/images/svg/rings.svg" class="lazyload" src=""><noscript><img src="https://blog.lixypro.com/wp-content/themes/ripro/assets/images/svg/rings.svg" width="50" height="50px"></noscript>
</noscript>
</noscript>
</noscript>
</div>
          </div>
      </div>
                  <div class="entry-wrapper">
                  
  <header class="entry-header">    
    <h4 class="entry-title"><a target="_blank" href="https://blog.lixypro.com/houduanyunwei/dns-server-construction-and-configuration.html" title="DNS服务器搭建与配置" rel="bookmark">DNS服务器搭建与配置</a></h4>  </header>                </div>
              </article>
            </div>
                  </div>
      </div>
    
  

<div class="bottom-area">
    <div id="comments" class="comments-area">
        
        
        
        	<div id="respond" class="comment-respond">
		<h3 id="reply-title" class="comment-reply-title">发表评论 <small><a rel="nofollow" id="cancel-comment-reply-link" href="https://blog.lixypro.com/houduanyunwei/iptables-for-linux-detailed-explanation-and-examples.html#respond" style="display:none;">取消回复</a></small>
</h3>
<form action="https://blog.lixypro.com/wp-comments-post.php" method="post" id="commentform" class="comment-form" novalidate>
<p class="comment-form-comment"><textarea id="comment" name="comment" rows="8" aria-required="true"></textarea></p>
<div class="row comment-author-inputs">
<div class="col-md-4 input"><p class="comment-form-author"><label for="author">昵称*</label><input id="author" name="author" type="text" value="" size="30" aria-required="true"></p></div>
<div class="col-md-4 input"><p class="comment-form-email"><label for="email">E-mail*</label><input id="email" name="email" type="text" value="" size="30" aria-required="true"></p></div>
<div class="col-md-4 input"><p class="comment-form-url"><label for="url">网站</label><input id="url" name="url" type="text" value="" size="30"></p></div>
</div>
<p class="comment-form-cookies-consent"><input id="wp-comment-cookies-consent" name="wp-comment-cookies-consent" type="checkbox" value="yes"> <label for="wp-comment-cookies-consent">下次发表评论时，请在此浏览器中保存我的姓名、电子邮件和网站</label></p>
<p class="form-submit"><input name="submit" type="submit" id="submit" class="button" value="发表评论"> <input type="hidden" name="comment_post_ID" value="43" id="comment_post_ID">
<input type="hidden" name="comment_parent" id="comment_parent" value="0">
</p>
</form>	</div>
<!-- #respond -->
	    </div>
</div>				</main>
			</div>
		</div>
			</div>
</div>


</div>
<!-- end sitecoent --> 

	
	<div class="module parallax">
		<img class="jarallax-img lazyload" data-srcset="https://blog.lixypro.com/wp-content/themes/ripro/assets/images/background/bg-1.jpg" data-sizes="auto" src="" alt="">
		<div class="container">
			<h4 class="entry-title">
				提供最优质的资源集合			</h4>
							<a target="_blank" class="button" href="https://blog.lixypro.com/">立即查看</a>
										<a target="_blank" class="button transparent" href="https://blog.lixypro.com/">了解详情</a>
					</div>
	</div>
	
	<footer class="site-footer">
		<div class="container">
			
			<div class="footer-widget">
    <div class="row">
        <div class="col-xs-12 col-sm-6 col-md-3 widget--about">
            <div class="widget--content">
                <div class="footer--logo mb-20">
                    <img data-dark="https://blog.lixypro.com/wp-content/uploads/2021/04/1618068529-96d6f2e7e1f705a.png" alt="Lixypro博客" data-src="https://blog.lixypro.com/wp-content/uploads/2021/04/1618068529-96d6f2e7e1f705a.png" class="tap-logo lazyload" src=""><noscript><img class="tap-logo" src="https://blog.lixypro.com/wp-content/uploads/2021/04/1618068529-96d6f2e7e1f705a.png" data-dark="https://blog.lixypro.com/wp-content/uploads/2021/04/1618068529-96d6f2e7e1f705a.png" alt="Lixypro博客"></noscript>
                </div>
                <p class="mb-10">Lixypro博客网站,专注于各种技术类.</p>
            </div>
        </div>
        <!-- .col-md-2 end -->
        <div class="col-xs-12 col-sm-3 col-md-2 col-md-offset-1 widget--links">
            <div class="widget--title">
                <h5>本站导航</h5>
            </div>
            <div class="widget--content">
                <ul class="list-unstyled mb-0">
                                    </ul>
            </div>
        </div>
        <!-- .col-md-2 end -->
        <div class="col-xs-12 col-sm-3 col-md-2 widget--links">
            <div class="widget--title">
                <h5>友情链接</h5>
            </div>
            <div class="widget--content">
                <ul class="list-unstyled mb-0">
                    <li><a target="_blank" href="https://www.baidu.com/">百度一下</a></li>
<li><a target="_blank" href="https://www.zhihu.com/">知乎官网</a></li>                </ul>
            </div>
        </div>
        <!-- .col-md-2 end -->
        <div class="col-xs-12 col-sm-12 col-md-4 widget--newsletter">
            <div class="widget--title">
                <h5>快速搜索</h5>
            </div>
            <div class="widget--content">
                <form class="newsletter--form mb-30" action="https://blog.lixypro.com/" method="get">
                    <input type="text" class="form-control" name="s" placeholder="关键词">
                    <button type="submit"><i class="fa fa-arrow-right"></i></button>
                </form>
                <h6>本站由WordPress程序强力驱动</h6>
            </div>
        </div>

    </div>
</div>						  <div class="site-info">
			    © 2021 Lixypro博客 & WordPress Theme. All rights reserved			    			  </div>
					</div>
	</footer>
	
<div class="rollbar">
	
	<div class="rollbar-item" etap="to_full" title="全屏页面"><i class="fa fa-arrows-alt"></i></div>

	
		<div class="rollbar-item" etap="to_top" title="返回顶部"><i class="fa fa-angle-up"></i></div>
</div>

<div class="dimmer"></div>



<div class="off-canvas">
  <div class="canvas-close"><i class="mdi mdi-close"></i></div>
  <div class="logo-wrapper">
      <a href="https://blog.lixypro.com/">
      <img alt="Lixypro博客" data-src="https://blog.lixypro.com/wp-content/uploads/2021/04/1618068529-96d6f2e7e1f705a.png" class="logo regular lazyload" src=""><noscript><img class="logo regular" src="https://blog.lixypro.com/wp-content/uploads/2021/04/1618068529-96d6f2e7e1f705a.png" alt="Lixypro博客"></noscript>
    </a>
    </div>
  <div class="mobile-menu hidden-lg hidden-xl"></div>
  <aside class="widget-area">
      </aside>
</div>
<script>
    console.log("\n %c RiPro V7.1.0 %c https://blog.lixypro.com \n\n", "color: #fadfa3; background: #030307; padding:5px 0;", "background: #fadfa3; padding:5px 0;");
    console.log("SQL 请求数：68");
    console.log("页面生成耗时： 0.33216");
</script>



<script type="text/javascript" id="toc-front-js-extra">
/* <![CDATA[ */
var tocplus = {"visibility_show":"show","visibility_hide":"hide","width":"Auto"};
/* ]]> */
</script>
<script type="text/javascript" src="https://blog.lixypro.com/wp-content/plugins/table-of-contents-plus/front.min.js?ver=2002" id="toc-front-js"></script>
<script type="text/javascript" src="https://cdn.jsdelivr.net/wp/wp-editormd/tags/10.2.1/assets/jQuery/jquery.min.js?ver=10.2.1" id="jQuery-CDN-js"></script>
<script type="text/javascript" src="https://cdn.jsdelivr.net/wp/wp-editormd/tags/10.2.1/assets/KaTeX/katex.min.js?ver=10.2.1" id="Katex-js"></script>
<script type="text/javascript" src="https://cdn.jsdelivr.net/wp/wp-editormd/tags/10.2.1/assets/ClipBoard/clipboard.min.js?ver=2.0.1" id="copy-clipboard-js"></script>
<script type="text/javascript" src="https://cdn.jsdelivr.net/wp/wp-editormd/tags/10.2.1/assets/Prism.js/components/prism-core.min.js?ver=1.15.0" id="prism-core-js-js"></script>
<script type="text/javascript" src="https://cdn.jsdelivr.net/wp/wp-editormd/tags/10.2.1/assets/Prism.js/plugins/autoloader/prism-autoloader.min.js?ver=1.15.0" id="prism-plugin-autoloader-js"></script>
<script type="text/javascript" src="https://cdn.jsdelivr.net/wp/wp-editormd/tags/10.2.1/assets/Prism.js/plugins/toolbar/prism-toolbar.min.js?ver=1.15.0" id="prism-plugin-toolbar-js"></script>
<script type="text/javascript" src="https://cdn.jsdelivr.net/wp/wp-editormd/tags/10.2.1/assets/Prism.js/plugins/line-numbers/prism-line-numbers.min.js?ver=1.15.0" id="prism-plugin-line-numbers-js"></script>
<script type="text/javascript" src="https://cdn.jsdelivr.net/wp/wp-editormd/tags/10.2.1/assets/Prism.js/plugins/show-language/prism-show-language.min.js?ver=1.15.0" id="prism-plugin-show-language-js"></script>
<script type="text/javascript" src="https://cdn.jsdelivr.net/wp/wp-editormd/tags/10.2.1/assets/Prism.js/plugins/copy-to-clipboard/prism-copy-to-clipboard.min.js?ver=1.15.0" id="prism-plugin-copy-to-clipboard-js"></script>
<script type="text/javascript" id="Front_Style-js-extra">
/* <![CDATA[ */
var FrontStyle = {"openLinkInNewTab":"on"};
/* ]]> */
</script>
<script type="text/javascript" src="https://cdn.jsdelivr.net/wp/wp-editormd/tags/10.2.1/assets/FrontStyle/frontstyle.min.js?ver=10.2.1" id="Front_Style-js"></script>
<script type="text/javascript" src="https://blog.lixypro.com/wp-content/plugins/wp-smushit/app/assets/js/smush-lazy-load.min.js?ver=3.8.4" id="smush-lazy-load-js"></script>
<script type="text/javascript" src="https://blog.lixypro.com/wp-content/themes/ripro/assets/js/plugins.js?ver=7.1.0" id="plugins-js"></script>
<script type="text/javascript" id="app-js-extra">
/* <![CDATA[ */
var caozhuti = {"site_name":"Lixypro博客","home_url":"https:\/\/blog.lixypro.com","ajaxurl":"https:\/\/blog.lixypro.com\/wp-admin\/admin-ajax.php","is_singular":"1","tencent_captcha":{"is":"","appid":""},"infinite_load":"加载更多","infinite_loading":"<i class=\"fa fa-spinner fa-spin\"><\/i> 加载中...","site_notice":{"is":"0","color":"rgb(33, 150, 243)","html":"<div class=\"notify-content\"><h3>Lixypro欢迎你!<\/h3><div>这是一条网站公告，可在后台开启或关闭，可自定义背景颜色，标题，内容，用户首次打开关闭后不再重复弹出，此处可使用html标签...<\/div><\/div>"},"pay_type_html":{"html":"<div class=\"pay-button-box\"><\/div><p style=\"font-size: 13px; padding: 0; margin: 0;\">免费或钻石免费资源仅限余额支付<\/p>","alipay":0,"weixinpay":0}};
/* ]]> */
</script>
<script type="text/javascript" src="https://blog.lixypro.com/wp-content/themes/ripro/assets/js/app.js?ver=7.1.0" id="app-js"></script>
<script type="text/javascript" src="https://blog.lixypro.com/wp-content/themes/ripro/assets/js/plugins/jquery.fancybox.min.js?ver=7.1.0" id="fancybox-js"></script>
<script type="text/javascript" src="https://blog.lixypro.com/wp-includes/js/comment-reply.min.js?ver=5.7" id="comment-reply-js"></script>
        <script type="text/javascript">
            (function ($) {
                $(document).ready(function () {
                    $(".katex.math.inline").each(function () {
                        var parent = $(this).parent()[0];
                        if (parent.localName !== "code") {
                            var texTxt = $(this).text();
                            var el = $(this).get(0);
                            try {
                                katex.render(texTxt, el);
                            } catch (err) {
                                $(this).html("<span class=\"err\">" + err);
                            }
                        } else {
                            $(this).parent().text($(this).parent().text());
                        }
                    });
                    $(".katex.math.multi-line").each(function () {
                        var texTxt = $(this).text();
                        var el = $(this).get(0);
                        try {
                            katex.render(texTxt, el, {displayMode: true})
                        } catch (err) {
                            $(this).html("<span class=\"err\">" + err)
                        }
                    });
                })
            })(jQuery);
        </script>
                <script type="text/javascript">
            Prism.plugins.autoloader.languages_path = "https://cdn.jsdelivr.net/wp/wp-editormd/tags/10.2.1/assets/Prism.js/components/";
        </script>
        
</div>
</body>
</html>